package com.lanyou.esb.cook.proxy.redis.proxy;

import java.io.IOException;
import java.util.List;

import redis.clients.jedis.exceptions.JedisException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.lanyou.esb.cook.proxy.exception.ParamSetRuntimeException;

/**
 * 针对String数据类型的Redis代理接口
 * 
 * @author Davey.wu
 */
public interface StrJedisProxy<T> extends JedisProxy<T> {
	/**
	 * 加载所有数据，以String类型存储到REDIS
	 * 
	 * @throws JsonProcessingException
	 * @throws ParamSetRuntimeException
	 */
	void loadAll(List<T> list) throws JedisException, JsonProcessingException;

	/**
	 * 根据键值获取REDIS字符串类型数据
	 * 
	 * @param key
	 *            ：键
	 * @return
	 * @throws IOException
	 * @throws JsonMappingException
	 * @throws JsonParseException
	 * @throws ParamSetRuntimeException
	 */
	T get(String key) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 批量读取字符串类型数据
	 * 
	 * @param keys
	 *            ：键集合
	 * @return
	 * @throws JedisException
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	List<T> get(List<String> keys) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 根据指定的键值，将目标存储到REDIS
	 * 
	 * @param key
	 *            ：键
	 * @param value
	 *            ：值
	 * @return
	 * @throws JsonProcessingException
	 * @throws ParamSetRuntimeException
	 */
	long setex(String key, T value) throws JedisException,
			JsonProcessingException;

	/**
	 * 增加相应KEY的值
	 * 
	 * @param key
	 *            ：键
	 * @param value
	 *            ：值
	 * @throws ParamSetRuntimeException
	 */
	void incrByFloat(String key, float value) throws JedisException;

	/**
	 * 增加相应KEY的值
	 * 
	 * @param key
	 *            ：键
	 * @param value
	 *            ：值
	 * @throws ParamSetRuntimeException
	 */
	void incrBy(String key, long value) throws JedisException;

	/**
	 * 判断键是否存在
	 * 
	 * @param key
	 *            ：键
	 * @return
	 * @throws ParamSetRuntimeException
	 */
	boolean exists(String key) throws JedisException;
}
